package br.com.intelsys.basics.bfactory;

import org.springframework.beans.factory.BeanFactory;

/**
 * Fabrica de Beans especializada no framework Spring.
 * 
 * @author Patrick Givsiez
 * 
 */
class BFactorySpring implements BFactory {
	BeanFactory beanFactory;

	/**
	 * Esta fabrica precisa ser criada enviando a fabrica de beans do Spring
	 * 
	 * @param beanFactory
	 */
	BFactorySpring(BeanFactory beanFactory) {
		this.beanFactory = beanFactory;
	}

	/**
	 * Verifica se existe um Bean na fabrica
	 * 
	 * @param name
	 *            Nome do bean
	 * @return true se o bean existe e esta disponivel
	 */
	public boolean containsBean(String name) {
		return (this.beanFactory.containsBean(name));
	}

	/**
	 * Recupera os "apelidos" de um determinado bean
	 * 
	 * @param name
	 *            Nome do bean
	 * @return Lista de "apelidos"
	 */
	public String[] getAliases(String name) {
		return (this.beanFactory.getAliases(name));
	}

	/**
	 * Recupera um Bean
	 * 
	 * @param name
	 *            Nome do Bean
	 * @return Bean. Necessita ser feito cast para usa-lo.
	 */
	public Object getBean(String name) {
		return (this.beanFactory.getBean(name));
	}

	/**
	 * Recupera um Bean
	 * 
	 * @param clazz
	 *            Classe do Bean
	 * @return Bean. Necessita ser feito cast para usa-lo.
	 */
	public Object getBean(Class<?> clazz) {
		return (this.beanFactory.getBean(clazz));
	}

	/**
	 * Recupera um Bean de um tipo determinado
	 * 
	 * @param name
	 *            Nome do Bean
	 * @param requiredType
	 *            Tipo requerido
	 * @return Bean. Ncessita ser feito cast para usa-lo.
	 */
	public Object getBean(String name, Class<?> bClass) {
		return (this.beanFactory.getBean(name, bClass));
	}

	/**
	 * Recupera qual eh o tipo de um determinado Bean
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @return Tipo do bean
	 */
	public Class<?> getType(String name) {
		return (this.beanFactory.getType(name));
	}

	/**
	 * Verifica se o Bean eh um Prototype.
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @return true se eh um Prototype
	 */
	public boolean isPrototype(String name) {
		return (this.beanFactory.isPrototype(name));
	}

	/**
	 * Verifica se um Bean eh um Singleton.
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @return true se eh um Singleton
	 */
	public boolean isSingleton(String name) {
		return (this.beanFactory.isSingleton(name));
	}

	/**
	 * Verifica se um determinado Bean eh compativel com algum tipo
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @param targetType
	 *            Tipo que sera verificado.
	 * @return true se eh compativel.
	 */
	public boolean isTypeMatch(String name, Class<?> targetType) {
		return (this.beanFactory.isTypeMatch(name, targetType));
	}
}
